print("""1.集合的创建方式""")

# 1.1花括号内以逗号分隔元素的方式
fruits = {
    "apple", "banana", "orange", "grape", "strawberry", "pineapple", "mango", "watermelon", "kiwi", "peach"
}

# 1.2类型构造器
fruits_set = set('cherry')

# 1.3.集合推导式
set_deduce = {c for c in 'abracadabra' if c not in 'abc'}

print("""2.set 和 frozenset 的实例提供的操作""")

# 1. len(s) 返回集合 s 中的元素数量（即 s 的基数）。
print(len(fruits))

# 2. x in s 检测 x 是否为 s 中的成员。
print('apple' in fruits)

# 3. x not in s 检测 x 是否非 s 中的成员。
print('cherry' not in fruits)

# 4.isdisjoint(other) 如果集合中没有与 other 共有的元素则返回 True。 当且仅当两个集合的交集为空集合时，两者为不相交集合。
print(fruits.isdisjoint(fruits_set))

# 5.issubset(other) 是 isdisjoint(other) 取反
print(fruits.issubset(fruits_set))

# set <= other 检测是否集合中的每个元素都在 other 之中。
print(fruits <= fruits_set)

# set < other 检测集合是否为 other 的真子集，即 set <= other and set != other。
print(fruits < fruits_set)

# 6.issuperset(other)
print(fruits.issuperset(fruits_set))

# set >= other 检测是否 other 中的每个元素都在集合之中。
print(fruits >= fruits_set)

# set > other 检测集合是否为 other 的真超集，即 set >= other and set != other。
print(fruits > fruits_set)

# 7. union(*others)
# set | other | ...
# 返回一个新集合，其中包含来自原集合以及 others 指定的所有集合中的元素。
print(fruits.union(fruits_set))

# 8. intersection(*others)
# set & other & ...
# 返回一个新集合，其中包含原集合以及 others 指定的所有集合中共有的元素。

# 9. difference(*others)
# set - other - ...
# 返回一个新集合，其中包含原集合中在 others 指定的其他集合中不存在的元素。

# 10. symmetric_difference(other)
# set ^ other
# 返回一个新集合，其中的元素或属于原集合或属于 other 指定的其他集合，但不能同时属于两者。

# 11.copy()
# 返回原集合的浅拷贝。

print("""集合的方法""")
# 1. add()  向集合中添加一个元素。如果元素已经存在于集合中，则不会有任何操作。
set1 = {1, 2, 3}
set1.add(4)
print(set1)
set1.add(1)
print(set1)

# 2. clear()  移除集合中的所有元素，使集合变为空集合。
set2 = {1, 2, 3, (1, 2, 3)}
print(set2)
set2.clear()
print(set2)

# 3. pop() 随机移除并返回集合中的一个元素。由于集合是无序的，无法预测会移除哪个元素。如果集合为空，会引发 `KeyError` 异常。
set3 = {5, 1, 2, 3, 4}
print(set3.pop())
print(set3)

# 4. remove() 移除集合中的指定元素。如果元素不存在，会引发 `KeyError` 异常。
set4 = {1, 2, 3, 7}
set4.remove(1)
print(set4)

# discard()  如果元素存在于集合中，则移除该元素。如果元素不存在，不会引发 `KeyError` 异常。
set4.discard(2)
set4.discard(1)
print(f'set4:{set4}')

# 5. update() 将其他给定集合中的所有元素添加到原集合中，去除重复元素，直接修改原集合。
set5 = {7, 8, 9}
set5.update(set4)
print(set5)

# 6. copy() 返回集合的浅拷贝。浅拷贝意味着新集合和原集合是不同的对象，但它们包含相同的元素。
print(id(set2))
print(set2.copy())
print(id(set2.copy()))

set6 = {1, 2, 3}
s_copy = set6.copy()
set6.clear()
print(s_copy)

# 7. union(*others)  返回一个新集合，该集合包含原集合和所有给定集合中的所有元素，去除重复元素。
set7 = {'1', '2', '3'}
print(set7.union(s_copy))

# 8. difference(*others)  返回一个新集合，该集合包含原集合中存在但在其他所有给定集合中不存在的元素。
set8 = {1, 2, 3}
set88 = {3, 4, 5}
print(set8.difference(set88))

# 9. difference_update(*others)  从原集合中移除所有在其他给定集合中也存在的元素，直接修改原集合。
set9 = {1, 2, 3}
set99 = {2, 3, 4}
set9.difference_update(set99)
print(set9)

# 10. symmetric_difference(other)  返回一个新集合，该集合包含原集合和另一个集合中不共同存在的元素。
set10 = {1, 2, 3}
set100 = {2, 3, 4}
print(set10.symmetric_difference(set100))

# 11. symmetric_difference_update(other)  将原集合更新为包含原集合和另一个集合中不共同存在的元素，直接修改原集合。
set11 = {1, 2, 3}
set111 = {2, 3, 4}
set11.symmetric_difference_update(set111)
print(set11)

# 12. intersection(*others)  返回一个新集合，该集合包含所有给定集合的交集元素。
set12 = {1, 2, 3}
set120 = {2, 3, 4}
print(set12.intersection(set120))

# 13. intersection_update(*others)  只保留原集合中同时也存在于其他所有给定集合中的元素，直接修改原集合。
set13 = {1, 2, 3}
set130 = {2, 3, 4}
set13.intersection_update(set130)
print(set13)

# 14. isdisjoint(other)  如果两个集合没有共同元素，则返回 `True`，否则返回 `False`
set14 = {1, 2, 3}
set140 = {2, 3, 4}
set1400 = {4, 5, 6}
print(set14.isdisjoint(set140))
print(set14.isdisjoint(set1400))

# 15. issubset(other)  如果原集合是另一个集合的子集（即原集合的所有元素都在另一个集合中），则返回 `True`，否则返回 `False`。
set15 = {2, 3, 4}
set150 = {1, 2, 3, 4, 5}
set1500 = {1, 4}
print(set15.issubset(set150))
print(set15.issubset(set1500))

# 16. issuperset(other)  如果原集合是另一个集合的超集（即另一个集合的所有元素都在原集合中），则返回 `True`，否则返回 `False`。
set16 = {1, 2, 3, 4, 5}
set160 = {1, 2, 3}
set1600 = {6}
print(set16.issuperset(set160))
print(set16.issuperset(set1600))
